/**
CREATE TABLE jugador (
  nombre VARCHAR2(30) PRIMARY KEY,
  tipo VARCHAR2(7)
);


CREATE TABLE partida (
  id_partida NUMBER(5) PRIMARY KEY,
  num_jugadores NUMBER(2)
);

CREATE TABLE juego (
  id_partida NUMBER(5) REFERENCES partida(id_partida),
  nombre_jugador VARCHAR2(30) REFERENCES jugador(nombre)
);

 *
 *
 * ALTER TABLE partida ADD CONSTRAINT par_gan_fk FOREIGN KEY (ganador) REFERENCES jugador(nombre);
 * CREATE SEQUENCE seq_partida
 * MINVALUE 1
 * START WITH 1
 * INCREMENT BY 1
 * CACHE 10
 * 
 * 
 * ALTER TABLE partida ADD ganador VARCHAR2(30) NOT NULL;
 * 
 * ALTER TABLE partida ADD CONSTRAINT par_gan_fk FOREIGN KEY (ganador) REFERENCES jugador(nombre);
 * 
 * insert into partida (idpartida, nJugadores, medPuntos) VALUES (seq_partida.nextval, ?,?);
 * insert into jugador (nombre, partida, puntos, ganada, botOrPlayer) VALUES (?, ?, ?, ?, ?);
 */


package JDBC;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author masterinftel11
 */
public class JavaDataBase {
    
    private Connection con = null;
    private final static String cadConexion = "jdbc:oracle:thin:@olimpia.lcc.uma.es:1521:edgar";
    private final static String userName = "inftel13_17";
    private final static String pwd = "nftl";
    
    
    public JavaDataBase() {
        try {
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
        } catch (ClassNotFoundException e) {
            
            System.out.println("Where is your Oracle JDBC Driver?");
            System.out.println(e);
            return;
            
        }
        
        //System.out.println("Oracle JDBC Driver Registered!");
        
        con = null;
        
        try {
            
            con = DriverManager.getConnection(
                    cadConexion, userName,
                    pwd);
            
        } catch (SQLException e) {
            
            System.out.println("Connection Failed! Check output console");
            System.out.println(e);
            return;
            
        }
        
        if (con == null) {
            System.out.println("Failed to make connection!");
        }
    }
    
    /**
     * Insert a Play Start 
     * @param Players
     * @param juego 
     */
    public void insertStart(int Players, String juego){
        try {
            PreparedStatement smt = con.prepareStatement("insert into partida (id_partida, num_jugadores, juego) VALUES (seq_partida.nextval, ?, ?)");
            smt.setInt(1, Players);
            smt.setString(2, juego);
            smt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(JavaDataBase.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Insert Player
     * @param nombre of player
     * @param tipo
     * @throws SQLException 
     */
    public void insertPlayer (String nombre, String tipo) throws SQLException{
        try {
            PreparedStatement smt = con.prepareStatement("insert into jugador (nombre, tipo) VALUES (?, ?)");
            smt.setString(1, nombre);
            smt.setString(2, tipo);
            smt.executeUpdate();
        } catch (SQLException ex) {
            //System.out.println("Jugador "+ nombre + " ya existe");
        }
    }
    
    /**
     * Insert Game
     * @param nombre
     * @param victoria 
     */
    public void insertGame (String nombre, int victoria){
        try {
            PreparedStatement smt = con.prepareStatement("insert into juego (id_Partida, nombre_jugador, victoria) VALUES (seq_partida.currval, ?, ?)");
            smt.setString(1, nombre);
            smt.setInt(2, victoria);
            smt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(JavaDataBase.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Method to get best players depend of game
     * @param game to get players
     * @return best players
     */
    public ArrayList<String> getbestplayers(String game, int top){
        ArrayList<String> best = new ArrayList<>();
        
        try {
            PreparedStatement smt = con.prepareStatement("select j.nombre_jugador, sum(j.victoria) as wins from juego j, partida p where j.ID_PARTIDA = p.ID_PARTIDA and p.JUEGO=? group by nombre_jugador order by sum(j.victoria) desc");
            smt.setString(1, game);
            ResultSet rows;
            rows = smt.executeQuery();
            int n = 0; 
            while(rows.next() && n<top){
                String name = rows.getString("nombre_jugador");
                int wins = rows.getInt("wins");
                best.add(name+" "+String.valueOf(wins));
                System.out.println(name+" "+String.valueOf(wins));
                n++;
            }
        } catch (SQLException ex) {
            Logger.getLogger(JavaDataBase.class.getName()).log(Level.SEVERE, null, ex);
        }        
        return best;
    }
    
    /**
     * Method to disconnect of DataBase
     */
    public void disconnect(){
        try {
            this.con.close();
        } catch (SQLException ex) {
            Logger.getLogger(JavaDataBase.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
